home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume7 / tput2 < prev    next >
Encoding:
Internet Message Format  |  1986-12-02  |  32.1 KB

  1. Subject:  v07i072:  Public-domain TPUT (corrected implementation)
  2. Newsgroups: mod.sources
  3. Approved: mirror!rs
  4.  
  5. Submitted by: seismo!rochester!ur-valhalla!badri (Badri Lokanathan)
  6. Mod.sources: Volume 7, Issue 72
  7. Archive-name: tput2
  8.  
  9. After a lot of discussion with Mark Horton, I decided to make
  10. modifications to the format of tput so that it would be compatible with
  11. sys V shell scripts (my previous version unfortunately was not.) I am
  12. reposting the source so that you can either redistribute it or just
  13. archive it.
  14.  
  15. Sorry for all the confusion.
  16. Badri Lokanathan
  17. ------------------------------------------
  18. #! /bin/sh
  19. # This is a shell archive, meaning:
  20. # 1. Remove everything above the #! /bin/sh line.
  21. # 2. Save the resulting text in a file.
  22. # 3. Execute the file with /bin/sh (not csh) to create:
  23. #    README
  24. #    Makefile
  25. #    tput.1
  26. #    tput.h
  27. #    tput.c
  28. export PATH; PATH=/bin:/usr/bin:$PATH
  29. if test -f 'README'
  30. then
  31.     echo shar: "will not over-write existing file 'README'"
  32. else
  33. cat << \xxTPUTxx > 'README'
  34. From: rochester!ur-valhalla!badri Sep 19 17:31:33 EDT 1986
  35. To: whom it may concern
  36. Subject: Public domain tput release 2
  37.  
  38. This revision has undergone major changes after the first one, mainly
  39. because the first release was not compatible with SV tput.
  40. New features are:
  41.  
  42. (1) Totally different capability naming conventions from first
  43.     release, but equivalent to SV conventions.
  44.  
  45. (2) Error messages are properly reported.
  46.  
  47. (3) Can be used to query for properties of other terminals also.
  48.  
  49. Problems still not properly handled:
  50. Limited features: Handles almost all termcap features, but is still
  51. only a subset of the latest version tput because terminfo has not been used.
  52. On the other hand if terminfo was available, most probably tput would
  53. be too!
  54.  
  55. Thanks to Mark Horton @ cbosgd for suggestions.
  56. Badri Lokanathan
  57. --------------------------------------------------------------------------------
  58. From: rochester!ur-valhalla!badri  Aug 28 10:02
  59. To: whom it may concern
  60. Subject: tput instructions
  61.  
  62. This program is supposed to be equivalent to the system V utility
  63. tput, which handles screen parameters from termcap. It may take inputs
  64. in a slightly different format (basically because I wrote this program
  65. without actually having worked on tput.) Any suggestions/modifications
  66. are welcome.
  67.  
  68. Your system is assumed to have termlib and associated functions (I
  69. wrote the program on BSD 4.2, assuming that termlib was fairly
  70. standard.) There is one include file in the program - sgtty.h which
  71. should be present. If not, I hope an equivalent exists.
  72. Other than that, the code should be fairly portable.
  73.  
  74. The make file is delibrately trivial. It does not do any installation
  75. - just compilation.
  76.  
  77. make
  78.  
  79. will make tput in the current directory.
  80.  
  81. make man
  82.  
  83. will make a man page in tput.doc.
  84.  
  85.  
  86. tput, written by Badri Lokanathan, is in the public domain, and may be
  87. used by any person or organization, in any way and for any purpose.
  88. There is no warranty of merchantability nor any warranty of fitness for
  89. a particular purpose nor any other warranty, either express or implied,
  90. as to the accuracy of the enclosed materials or as to their suitability
  91. for any particular purpose.  Accordingly, the author assumes no respon-
  92. sibility for their use by the recipient.   Further, the author assumes
  93. no obligation to furnish any assistance of any kind whatsoever, or to
  94. furnish any additional information or documentation.
  95. xxTPUTxx
  96. fi
  97. if test -f 'Makefile'
  98. then
  99.     echo shar: "will not over-write existing file 'Makefile'"
  100. else
  101. cat << \xxTPUTxx > 'Makefile'
  102. tput: tput.c tput.h
  103.     cc -o tput tput.c -ltermlib
  104.  
  105. man: tput.1
  106.     nroff -man tput.1 > tput.doc
  107.  
  108. dtput: tput.c tput.h
  109.     cc -g -o dtput tput.c -ltermlib
  110.  
  111. lint:
  112.     lint -DLINT tput.c
  113. xxTPUTxx
  114. fi
  115. if test -f 'tput.1'
  116. then
  117.     echo shar: "will not over-write existing file 'tput.1'"
  118. else
  119. cat << \xxTPUTxx > 'tput.1'
  120. .TH tput 1local "UR EE GRADUATE VLSI LAB"
  121. .SH NAME
  122. tput \- query termcap data base
  123. .SH SYNOPSIS
  124. .B  tput
  125. [
  126. \fB-T\fRtype
  127. ]
  128. [
  129. \fB-e\fR
  130. ]
  131. capname
  132. [
  133. .I x
  134. .I y
  135. ]
  136. .SH DESCRIPTION
  137. .ad
  138. .I tput
  139. uses the \fItermcap(5)\fR data base to make terminal-dependent
  140. capabilities and information available to the shell. \fITput\fR outputs
  141. a string if the attribute (\fBcap\fRability \fBname\fR) is of type
  142. string, or an integer if the attribute is of type integer. If the
  143. attribute is of type Boolean, tput simply sets the exit code (0 for
  144. TRUE, 1 for FALSE) and does no output.
  145. .sp 1
  146. .ta 1i
  147. .fc #
  148. #\fB-T\fRtype#indicates the type of terminal. Normally this flag
  149. .br
  150. ##is unnecessary, as the default is taken from the
  151. .br
  152. ##environment variable \fB$TERM.\fR
  153. .br
  154. #\fB-e\fR#suppresses the printing of error messages. In case
  155. .br
  156. ##an error occurs, an error code is returned with or
  157. .br
  158. ##without this flag.
  159. .br
  160. #Capname#indicates the attribute (mapping to an attribute
  161. .br
  162. ##from the \f\Itermcap\f\R database.)
  163. .sp 1
  164. x and y are integer values for cursor movement.
  165. .sp 1
  166. Typical capname options are given below.
  167. .SH REQUESTS
  168. .in 0
  169. .ll 8i
  170. .ta .75i 1.5i 2.5i 
  171. .B Option\tType\tTermcap\tExplanation
  172. .br
  173. am    bool    am    Terminal has automatic margins
  174. .br
  175. bw    bool    bw    cub1 wraps from column 0 to last column
  176. .br
  177. chts    bool    HC    Cursor is hard to see.
  178. .br
  179. da    bool    da    Display may be retained above the screen
  180. .br
  181. db    bool    db    Display may be retained below the screen
  182. .br
  183. eo    bool    eo    Can erase overstrikes with a blank
  184. .br
  185. eslok    bool    es    Escape can be used on the status line
  186. .br
  187. gn    bool    gn    Generic line type (e.g. dialup, switch).
  188. .br
  189. hc    bool    hc    Hardcopy terminal
  190. .br
  191. hs    bool    hs    Has extra "status line"
  192. .br
  193. hz    bool    hz    Hazeltine; can't print ~'s
  194. .br
  195. in    bool    in    Insert mode distinguishes nulls
  196. .br
  197. km    bool    km    Has a meta key (shift, sets parity bit)
  198. .br
  199. mc5i    bool    5i    Printer won't echo on screen.
  200. .br
  201. mir    bool    mi    Safe to move while in insert mode
  202. .br
  203. msgr    bool    ms    Safe to move in standout modes
  204. .br
  205. npc    bool    NP    Pad character doesn't exist.
  206. .br
  207. nrrmc    bool    NR    Smcup does not reverse rmcup.
  208. .br
  209. nxon    bool    nx    Padding won't work, xon/xoff required
  210. .br
  211. os    bool    os    Terminal overstrikes
  212. .br
  213. ul    bool    ul    underline character overstrikes
  214. .br
  215. xenl    bool    xn    newline ignored after 80 cols (Concept)
  216. .br
  217. xhp    bool    xs    Standout not erased by overwriting (hp)
  218. .br
  219. xon    bool    xo    Terminal uses xon/xoff handshaking
  220. .br
  221. xsb    bool    xb    Beehive (f1=escape, f2=ctrl C)
  222. .br
  223. xt    bool    xt    Tabs destructive, magic so char (t1061)
  224. .br
  225. cols    num    co    Number of columns in a line
  226. .br
  227. it    num    it    Tabs initially every \# spaces.
  228. .br
  229. lh    num    lh    \# rows in each label
  230. .br
  231. lines    num    li    Number of lines on screen or page
  232. .br
  233. lm    num    lm    Lines of memory if > lines.  0 => varies
  234. .br
  235. lw    num    lw    \# cols in each label
  236. .br
  237. nlab    num    Nl    \# of labels on screen (start at 1)
  238. .br
  239. pb    num    pb    Lowest baud rate where padding needed
  240. .br
  241. vt    num    vt    Virtual terminal number (CB/Unix)
  242. .br
  243. wsl    num    ws    \# columns in status line
  244. .br
  245. xmc    num    sg    Number blank chars left by smso or rmso
  246. .br
  247. acsc    str    ac    Graphic charset pairs aAbBcC - def=vt100
  248. .br
  249. bel    str    bl    Audible signal (bell)
  250. .br
  251. blink    str    mb    Turn on blinking
  252. .br
  253. bold    str    md    Turn on bold (extra bright) mode
  254. .br
  255. cbt    str    bt    Back tab
  256. .br
  257. civis    str    vi    Make cursor invisible
  258. .br
  259. clear    str    cl    Clear screen (*)
  260. .br
  261. cmdch    str    CC    Term. settable cmd char in prototype
  262. .br
  263. cnorm    str    ve    Make cursor appear normal (undo vs/vi)
  264. .br
  265. cr    str    cr    Carriage return (*)
  266. .br
  267. csr    str    cs    change to lines \#1 thru \#2 (vt100) (G)
  268. .br
  269. cub    str    LE    Move cursor left \#1 spaces (G)
  270. .br
  271. cub1    str    le    Move cursor left one space.
  272. .br
  273. cud    str    DO    Move cursor down \#1 lines. (G*)
  274. .br
  275. cud1    str    do    Down one line
  276. .br
  277. cuf    str    RI    Move cursor right \#1 spaces. (G*)
  278. .br
  279. cuf1    str    nd    Non-destructive space (cursor right)
  280. .br
  281. cup    str    cm    Cursor motion to row \#1 col \#2 (G)
  282. .br
  283. cuu    str    UP    Move cursor up \#1 lines. (G*)
  284. .br
  285. cuu1    str    up    Upline (cursor up)
  286. .br
  287. cvvis    str    vs    Make cursor very visible
  288. .br
  289. dch    str    DC    Delete \#1 chars (G*)
  290. .br
  291. dch1    str    dc    Delete character (*)
  292. .br
  293. dim    str    mh    Turn on half-bright mode
  294. .br
  295. dl    str    DL    Delete \#1 lines (G*)
  296. .br
  297. dl1    str    dl    Delete line (*)
  298. .br
  299. dsl    str    ds    Disable status line
  300. .br
  301. ech    str    ec    Erase \#1 characters (G)
  302. .br
  303. ed    str    cd    Clear to end of display (*)
  304. .br
  305. el    str    ce    Clear to end of line
  306. .br
  307. el1    str    cb    Clear to beginning of line, inclusive
  308. .br
  309. enacs    str    eA    Enable alternate char set
  310. .br
  311. ff    str    ff    Hardcopy terminal page eject (*)
  312. .br
  313. flash    str    vb    Visible bell (may not move cursor)
  314. .br
  315. fsl    str    fs    Return from status line
  316. .br
  317. hd    str    hd    Half-line down (forward 1/2 linefeed)
  318. .br
  319. home    str    ho    Home cursor (if no cup)
  320. .br
  321. hpa    str    ch    Set cursor column (G)
  322. .br
  323. ht    str    ta    Tab to next 8 space hardware tab stop.
  324. .br
  325. hts    str    st    Set a tab in all rows, current column.
  326. .br
  327. hu    str    hu    Half-line up (reverse 1/2 linefeed)
  328. .br
  329. ich    str    IC    Insert \#1 blank chars (G*)
  330. .br
  331. ich1    str    ic    Insert character
  332. .br
  333. if    str    if    Name of file containing is
  334. .br
  335. il    str    AL    Add \#1 new blank lines (G*)
  336. .br
  337. il1    str    al    Add new blank line (*)
  338. .br
  339. ind    str    sf    Scroll text up
  340. .br
  341. indn    str    SF    Scroll forward \#1 lines. (G)
  342. .br
  343. invis    str    mk    Turn on blank mode (chars invisible)
  344. .br
  345. ip    str    ip    Insert pad after character inserted (*)
  346. .br
  347. iprog    str    iP    Path name of program for init.
  348. .br
  349. is1    str    i1    Terminal initialization string
  350. .br
  351. is2    str    is    Terminal initialization string
  352. .br
  353. is3    str    i3    Terminal initialization string
  354. .br
  355. kBEG    str    &9    KEY_SBEG, 0572, shifted beginning key
  356. .br
  357. kCAN    str    &0    KEY_SCANCEL, 0573, shifted cancel key
  358. .br
  359. kCMD    str    *1    KEY_SCOMMAND, 0574, shifted command key
  360. .br
  361. kCPY    str    *2    KEY_SCOPY, 0575, shifted copy key
  362. .br
  363. kCRT    str    *3    KEY_SCREATE, 0576, shifted create key
  364. .br
  365. kDC    str    *4    KEY_SDC, 0577, shifted delete char key
  366. .br
  367. kDL    str    *5    KEY_SDL, 0600, shifted delete line key
  368. .br
  369. kEND    str    *7    KEY_SEND, 0602, shifted end key
  370. .br
  371. kEOL    str    *8    KEY_SEOL, 0603, shifted clear line key
  372. .br
  373. kEXT    str    *9    KEY_SEXIT, 0604, shifted exit key
  374. .br
  375. kFND    str    *0    KEY_SFIND, 0605, shifted find key
  376. .br
  377. kHLP    str    \#1    KEY_SHELP, 0606, shifted help key
  378. .br
  379. kHOM    str    \#2    KEY_SHOME, 0607, shifted home key
  380. .br
  381. kIC    str    \#3    KEY_SIC, 0610, shifted input key
  382. .br
  383. kLFT    str    \#4    KEY_SLEFT, 0611, shifted left arrow key
  384. .br
  385. kMOV    str    %b    KEY_SMOVE, 0613, shifted move key
  386. .br
  387. kMSG    str    %a    KEY_SMESSAGE, 0612, shifted message key
  388. .br
  389. kNXT    str    %c    KEY_SNEXT, 0614, shifted next key
  390. .br
  391. kOPT    str    %d    KEY_SOPTIONS, 0615, shifted options key
  392. .br
  393. kPRT    str    %f    KEY_SPRINT, 0617, shifted print key
  394. .br
  395. kPRV    str    %e    KEY_SPREVIOUS, 0616, shifted prev key
  396. .br
  397. kRDO    str    %g    KEY_SREDO, 0620, shifted redo key
  398. .br
  399. kRES    str    %j    KEY_SRSUME, 0623, shifted resume key
  400. .br
  401. kRIT    str    %i    KEY_SRIGHT, 0622, shifted right arrow
  402. .br
  403. kRPL    str    %h    KEY_SREPLACE, 0621, shifted replace key
  404. .br
  405. kSAV    str    !1    KEY_SSAVE, 0624, shifted save key
  406. .br
  407. kSPD    str    !2    KEY_SSUSPEND, 0625, shifted suspend key
  408. .br
  409. kUND    str    !3    KEY_SUNDO, 0626, shifted undo key
  410. .br
  411. ka1    str    K1    KEY_A1, 0534, Upper left of keypad
  412. .br
  413. ka3    str    K3    KEY_A3, 0535, Upper right of keypad
  414. .br
  415. kb2    str    K2    KEY_B2, 0536, Center of keypad
  416. .br
  417. kbeg    str    @1    KEY_BEG, 0542, beg(inning) key
  418. .br
  419. kbs    str    kb    KEY_BACKSPACE, 0407, Sent by backspace key
  420. .br
  421. kc1    str    K4    KEY_C1, 0537, Lower left of keypad
  422. .br
  423. kc3    str    K5    KEY_C3, 0540, Lower right of keypad
  424. .br
  425. kcan    str    @2    KEY_CANCEL, 0543, cancel key
  426. .br
  427. kcbt    str    kB    KEY_BTAB, 0541, Back tab key
  428. .br
  429. kclo    str    @3    KEY_CLOSE, 0544, close key
  430. .br
  431. kclr    str    kC    KEY_CLEAR, 0515, Sent by clear screen or erase key.
  432. .br
  433. kcmd    str    @4    KEY_COMMAND, 0545, cmd (command) key
  434. .br
  435. kcpy    str    @5    KEY_COPY, 0546, copy key
  436. .br
  437. kcrt    str    @6    KEY_CREATE, 0547, create key
  438. .br
  439. kctab    str    kt    KEY_CTAB, 0525, Sent by clear-tab key
  440. .br
  441. kcub1    str    kl    KEY_LEFT, 0404, Sent by terminal left arrow key
  442. .br
  443. kcud1    str    kd    KEY_DOWN, 0402, Sent by terminal down arrow key
  444. .br
  445. kcuf1    str    kr    KEY_RIGHT, 0405, Sent by terminal right arrow key
  446. .br
  447. kcuu1    str    ku    KEY_UP, 0403, Sent by terminal up arrow key
  448. .br
  449. kdch1    str    kD    KEY_DC, 0512, Sent by delete character key.
  450. .br
  451. kdl1    str    kL    KEY_DL, 0510, Sent by delete line key.
  452. .br
  453. ked    str    kS    KEY_EOS, 0516, Sent by clear-to-end-of-screen key.
  454. .br
  455. kel    str    kE    KEY_EOL, 0517, Sent by clear-to-end-of-line key.
  456. .br
  457. kend    str    @7    KEY_END, 0550, end key
  458. .br
  459. kent    str    @8    KEY_ENTER, 0527, Enter/send (unreliable)
  460. .br
  461. kext    str    @9    KEY_EXIT, 0551, exit key
  462. .br
  463. kf0    str    k0    KEY_F(0), 0410, function key f0.
  464. .br
  465. kf1    str    k1    KEY_F(1), 0411, function key f1.
  466. .br
  467. kf10    str    k;    KEY_F(10), 0422, function key f10.
  468. .br
  469. kf11    str    F1    KEY_F(11), 0423, function key f11.
  470. .br
  471. kf12    str    F2    KEY_F(12), 0424, function key f12.
  472. .br
  473. kf13    str    F3    KEY_F(13), 0425, function key f13.
  474. .br
  475. kf14    str    F4    KEY_F(14), 0426, function key f14.
  476. .br
  477. kf15    str    F5    KEY_F(15), 0427, function key f15.
  478. .br
  479. kf16    str    F6    KEY_F(16), 0430, function key f16.
  480. .br
  481. kf17    str    F7    KEY_F(17), 0431, function key f17.
  482. .br
  483. kf18    str    F8    KEY_F(18), 0432, function key f18.
  484. .br
  485. kf19    str    F9    KEY_F(19), 0433, function key f19.
  486. .br
  487. kf2    str    k2    KEY_F(2), 0412, function key f2.
  488. .br
  489. kf20    str    FA    KEY_F(20), 0434, function key f20.
  490. .br
  491. kf21    str    FB    KEY_F(21), 0435, function key f21.
  492. .br
  493. kf22    str    FC    KEY_F(22), 0436, function key f22.
  494. .br
  495. kf23    str    FD    KEY_F(23), 0437, function key f23.
  496. .br
  497. kf24    str    FE    KEY_F(24), 0440, function key f24.
  498. .br
  499. kf25    str    FF    KEY_F(25), 0441, function key f25.
  500. .br
  501. kf26    str    FG    KEY_F(26), 0442, function key f26.
  502. .br
  503. kf27    str    FH    KEY_F(27), 0443, function key f27.
  504. .br
  505. kf28    str    FI    KEY_F(28), 0444, function key f28.
  506. .br
  507. kf29    str    FJ    KEY_F(29), 0445, function key f29.
  508. .br
  509. kf3    str    k3    KEY_F(3), 0413, function key f3.
  510. .br
  511. kf30    str    FK    KEY_F(30), 0446, function key f30.
  512. .br
  513. kf31    str    FL    KEY_F(31), 0447, function key f31.
  514. .br
  515. kf32    str    FM    KEY_F(32), 0450, function key f32.
  516. .br
  517. kf33    str    FN    KEY_F(13), 0451, function key f13.
  518. .br
  519. kf34    str    FO    KEY_F(34), 0452, function key f34.
  520. .br
  521. kf35    str    FP    KEY_F(35), 0453, function key f35.
  522. .br
  523. kf36    str    FQ    KEY_F(36), 0454, function key f36.
  524. .br
  525. kf37    str    FR    KEY_F(37), 0455, function key f37.
  526. .br
  527. kf38    str    FS    KEY_F(38), 0456, function key f38.
  528. .br
  529. kf39    str    FT    KEY_F(39), 0457, function key f39.
  530. .br
  531. kf4    str    k4    KEY_F(4), 0414, function key f4.
  532. .br
  533. kf40    str    FU    KEY_F(40), 0460, function key f40.
  534. .br
  535. kf41    str    FV    KEY_F(41), 0461, function key f41.
  536. .br
  537. kf42    str    FW    KEY_F(42), 0462, function key f42.
  538. .br
  539. kf43    str    FX    KEY_F(43), 0463, function key f43.
  540. .br
  541. kf44    str    FY    KEY_F(44), 0464, function key f44.
  542. .br
  543. kf45    str    FZ    KEY_F(45), 0465, function key f45.
  544. .br
  545. kf46    str    Fa    KEY_F(46), 0466, function key f46.
  546. .br
  547. kf47    str    Fb    KEY_F(47), 0467, function key f47.
  548. .br
  549. kf48    str    Fc    KEY_F(48), 0470, function key f48.
  550. .br
  551. kf49    str    Fd    KEY_F(49), 0471, function key f49.
  552. .br
  553. kf5    str    k5    KEY_F(5), 0415, function key f5.
  554. .br
  555. kf50    str    Fe    KEY_F(50), 0472, function key f50.
  556. .br
  557. kf51    str    Ff    KEY_F(51), 0473, function key f51.
  558. .br
  559. kf52    str    Fg    KEY_F(52), 0474, function key f52.
  560. .br
  561. kf53    str    Fh    KEY_F(53), 0475, function key f53.
  562. .br
  563. kf54    str    Fi    KEY_F(54), 0476, function key f54.
  564. .br
  565. kf55    str    Fj    KEY_F(55), 0477, function key f55.
  566. .br
  567. kf56    str    Fk    KEY_F(56), 0500, function key f56.
  568. .br
  569. kf57    str    Fl    KEY_F(57), 0501, function key f57.
  570. .br
  571. kf58    str    Fm    KEY_F(58), 0502, function key f58.
  572. .br
  573. kf59    str    Fn    KEY_F(59), 0503, function key f59.
  574. .br
  575. kf6    str    k6    KEY_F(6), 0416, function key f6.
  576. .br
  577. kf60    str    Fo    KEY_F(60), 0504, function key f60.
  578. .br
  579. kf61    str    Fp    KEY_F(61), 0505, function key f61.
  580. .br
  581. kf62    str    Fq    KEY_F(62), 0506, function key f62.
  582. .br
  583. kf63    str    Fr    KEY_F(63), 0507, function key f63.
  584. .br
  585. kf7    str    k7    KEY_F(7), 0417, function key f7.
  586. .br
  587. kf8    str    k8    KEY_F(8), 0420, function key f8.
  588. .br
  589. kf9    str    k9    KEY_F(9), 0421, function key f9.
  590. .br
  591. kfnd    str    @0    KEY_FIND, 0552, find key
  592. .br
  593. khlp    str    %1    KEY_HELP, 0553, help key
  594. .br
  595. khome    str    kh    KEY_HOME, 0406, Sent by home key.
  596. .br
  597. khts    str    kT    KEY_STAB, 0524, Sent by set-tab key
  598. .br
  599. kich1    str    kI    KEY_IC, 0513, Sent by ins char/enter ins mode key.
  600. .br
  601. kil1    str    kA    KEY_IL, 0511, Sent by insert line.
  602. .br
  603. kind    str    kF    KEY_SF, 0520, Sent by scroll-forward/down key
  604. .br
  605. kll    str    kH    KEY_LL, 0533, Sent by home-down key
  606. .br
  607. kmov    str    %4    KEY_MOVE, 0556, move key
  608. .br
  609. kmrk    str    %2    KEY_MARK, 0554, mark key
  610. .br
  611. kmsg    str    %3    KEY_MESSAGE, 0555, message key
  612. .br
  613. knp    str    kN    KEY_NPAGE, 0522, Sent by next-page key
  614. .br
  615. knxt    str    %5    KEY_NEXT, 0557, next object key
  616. .br
  617. kopn    str    %6    KEY_OPEN, 0560, open key
  618. .br
  619. kopt    str    %7    KEY_OPTIONS, 0561, options key
  620. .br
  621. kpp    str    kP    KEY_PPAGE, 0523, Sent by previous-page key
  622. .br
  623. kprt    str    %9    KEY_PRINT, 0532, print or copy
  624. .br
  625. kprv    str    %8    KEY_PREVIOUS, 0562, previous object key
  626. .br
  627. krdo    str    %0    KEY_REDO, 0563, redo key
  628. .br
  629. kref    str    &1    KEY_REFERENCE, 0564, ref(erence) key
  630. .br
  631. kres    str    &5    KEY_RESUME, 0570, resume key
  632. .br
  633. krfr    str    &2    KEY_REFRESH, 0565, refresh key
  634. .br
  635. kri    str    kR    KEY_SR, 0521, Sent by scroll-backward/up key
  636. .br
  637. krmir    str    kM    KEY_EIC, 0514, Sent by rmir or smir in insert mode.
  638. .br
  639. krpl    str    &3    KEY_REPLACE, 0566, replace key
  640. .br
  641. krst    str    &4    KEY_RESTART, 0567, restart key
  642. .br
  643. ksav    str    &6    KEY_SAVE, 0571, save key
  644. .br
  645. kslt    str    *6    KEY_SELECT, 0601, select key
  646. .br
  647. kspd    str    &7    KEY_SUSPEND, 0627, suspend key
  648. .br
  649. ktbc    str    ka    KEY_CATAB, 0526, Sent by clear-all-tabs key.
  650. .br
  651. kund    str    &8    KEY_UNDO, 0630, undo key
  652. .br
  653. lf0    str    l0    Labels on function key f0 if not f0
  654. .br
  655. lf1    str    l1    Labels on function key f1 if not f1
  656. .br
  657. lf10    str    la    Labels on function key f10 if not f10
  658. .br
  659. lf2    str    l2    Labels on function key f2 if not f2
  660. .br
  661. lf3    str    l3    Labels on function key f3 if not f3
  662. .br
  663. lf4    str    l4    Labels on function key f4 if not f4
  664. .br
  665. lf5    str    l5    Labels on function key f5 if not f5
  666. .br
  667. lf6    str    l6    Labels on function key f6 if not f6
  668. .br
  669. lf7    str    l7    Labels on function key f7 if not f7
  670. .br
  671. lf8    str    l8    Labels on function key f8 if not f8
  672. .br
  673. lf9    str    l9    Labels on function key f9 if not f9
  674. .br
  675. ll    str    ll    Last line, first column (if no cup)
  676. .br
  677. mc0    str    ps    Print contents of the screen
  678. .br
  679. mc4    str    pf    Turn off the printer
  680. .br
  681. mc5    str    po    Turn on the printer
  682. .br
  683. mc5p    str    pO    Turn on the printer for \#1 bytes.
  684. .br
  685. mgc    str    MC    Clear left and right soft margins
  686. .br
  687. mrcup    str    CM    Memory relative cursor addressing.
  688. .br
  689. nel    str    nw    Newline (behaves like cr followed by lf)
  690. .br
  691. pad    str    pc    Pad character (rather than null)
  692. .br
  693. pfkey    str    pk    Prog funct key \#1 to type string \#2
  694. .br
  695. pfloc    str    pl    Prog funct key \#1 to execute string \#2
  696. .br
  697. pfx    str    px    Prog funct key \#1 to xmit string \#2
  698. .br
  699. pln    str    pn    Prog label \#1 to show string \#2
  700. .br
  701. prot    str    mp    Turn on protected mode
  702. .br
  703. rc    str    rc    Restore cursor to position of last sc.
  704. .br
  705. rep    str    rp    Repeat char \#1 \#2 times.  (G*)
  706. .br
  707. rev    str    mr    Turn on reverse video mode
  708. .br
  709. rf    str    rf    Name of file containing reset string.
  710. .br
  711. rfi    str    RF    send next input char (for ptys)
  712. .br
  713. ri    str    sr    Scroll text down
  714. .br
  715. rin    str    SR    Scroll backward \#1 lines. (G)
  716. .br
  717. rmacs    str    ae    End alternate character set
  718. .br
  719. rmam    str    RA    Turn off automatic margins
  720. .br
  721. rmcup    str    te    String to end programs that use cup
  722. .br
  723. rmdc    str    ed    End delete mode
  724. .br
  725. rmir    str    ei    End insert mode;
  726. .br
  727. rmkx    str    ke    Out of "keypad transmit" mode
  728. .br
  729. rmln    str    LF    Turn off soft labels
  730. .br
  731. rmm    str    mo    Turn off "meta mode"
  732. .br
  733. rmp    str    rP    Like ip but when in replace mode
  734. .br
  735. rmso    str    se    End stand out mode
  736. .br
  737. rmul    str    ue    End underscore mode
  738. .br
  739. rmxon    str    RX    Turn off xon/xoff handshaking
  740. .br
  741. rs1    str    r1    Reset terminal completely to sane modes.
  742. .br
  743. rs2    str    r2    Reset terminal completely to sane modes.
  744. .br
  745. rs3    str    r3    Reset terminal completely to sane modes.
  746. .br
  747. sc    str    sc    Save cursor position.
  748. .br
  749. sgr    str    sa    Define the video attributes (G9)
  750. .br
  751. sgr0    str    me    Turn off all attributes
  752. .br
  753. smacs    str    as    Start alternate character set
  754. .br
  755. smam    str    SA    Turn on automatic margins
  756. .br
  757. smcup    str    ti    String to begin programs that use cup
  758. .br
  759. smdc    str    dm    Delete mode (enter)
  760. .br
  761. smgl    str    ML    Set soft left margin
  762. .br
  763. smgr    str    MR    Set soft right margin
  764. .br
  765. smir    str    im    Insert mode (enter);
  766. .br
  767. smkx    str    ks    Put terminal in "keypad transmit" mode
  768. .br
  769. smln    str    LO    Turn on soft labels
  770. .br
  771. smm    str    mm    Turn on "meta mode" (8th bit)
  772. .br
  773. smso    str    so    Begin stand out mode
  774. .br
  775. smul    str    us    Start underscore mode
  776. .br
  777. smxon    str    SX    Turn on xon/xoff handshaking
  778. .br
  779. tbc    str    ct    Clear all tab stops.
  780. .br
  781. tsl    str    ts    Go to status line, col \#1
  782. .br
  783. uc    str    uc    Underscore one char and move past it
  784. .br
  785. vpa    str    cv    Like hpa but sets row. (G)
  786. .br
  787. wind    str    wi    Current window is lines \#1-\#2 cols \#3-\#4
  788. .br
  789. xoffc    str    XF    X-off character
  790. .br
  791. xonc    str    XN    X-on character
  792. .br
  793. .ad
  794. .ll 6.5i
  795. .in .5i
  796. .SH FILES
  797. /etc/termcap
  798. .SH SEE ALSO
  799. termcap(3X), termcap(5)
  800. .SH DIAGNOSTICS
  801. Tput prints error messages (unless suppressed using -e) and returns
  802. the following error codes on error:
  803. .br
  804. #-1#Usage error.
  805. .br
  806. #-2#Bad terminal type.
  807. .br
  808. #-3#Bad capname.
  809. .sp 1
  810. .SH BUGS
  811. Complex capnames with many auxiliary parameters (such as sgr) do
  812. not work properly because curses has not been used - this program
  813. is based entirely on termcap (and that too from BSD4.2 manuals!)
  814. .PP
  815. -n option does not work for most capnames, so it has not been
  816. mentioned in this page.
  817. xxTPUTxx
  818. fi
  819. if test -f 'tput.h'
  820. then
  821.     echo shar: "will not over-write existing file 'tput.h'"
  822. else
  823. cat << \xxTPUTxx > 'tput.h'
  824. /*
  825.  * Copyright (C) $Date: 86/09/19 17:01:07 $
  826.  * by $Author: badri $
  827.  * University of Rochester,
  828.  * Department of Electrical Engineering.
  829.  *
  830.  * CoNtEnTs   This file contains various definitions for tput.
  831.  *
  832.  * $Locker:  $
  833.  * $Source: /u/users/badri/usr/src/local/tput/RCS/tput.h,v $
  834.  * $Revision: 1.2 $
  835.  *
  836.  * History of this release:
  837.  * $Log:    tput.h,v $
  838.  * Revision 1.2  86/09/19  17:01:07  badri
  839.  * Did some rearranging of things. Also incorporated error messages.
  840.  * 
  841.  * Revision 1.1  86/09/18  15:48:24  badri
  842.  * Initial revision
  843.  * 
  844.  */
  845. #include <sgtty.h>
  846. #include <stdio.h>
  847.  
  848. #ifndef XTABS
  849. #define XTABS 0006000
  850. #endif  XTABS
  851.  
  852. #define LARGEBUF 1024
  853. #define SMALLBUF   64
  854.  
  855. #define SYSTEM    666
  856. #define FAILURE     1
  857. #define SUCCESS     0
  858. #define BADUSE     -1
  859. #define BADTERM    -2
  860. #define BADCAP     -3
  861. /*
  862.  * To add new capabilities, increment table size and define the
  863.  * capability in the appropriate slot in the structure. Note that 
  864.  * the capabilities are lexicographically ordered. This ordering
  865.  * must be maintained for the binary search to work.
  866.  * Format for entry is 
  867.  * {"capability", "termcap_key"},
  868.  */
  869. #define TABLESIZE 310
  870. struct {char *key, *value} table[TABLESIZE] = {
  871.     {"acsc", "ac"},
  872.     {"am", "am"},
  873.     {"bel", "bl"},
  874.     {"blink", "mb"},
  875.     {"bold", "md"},
  876.     {"bw", "bw"},
  877.     {"cbt", "bt"},
  878.     {"chts", "HC"},
  879.     {"civis", "vi"},
  880.     {"clear", "cl"},
  881.     {"cmdch", "CC"},
  882.     {"cnorm", "ve"},
  883.     {"cols", "co"},
  884.     {"cr", "cr"},
  885.     {"csr", "cs"},
  886.     {"cub", "LE"},
  887.     {"cub1", "le"},
  888.     {"cud", "DO"},
  889.     {"cud1", "do"},
  890.     {"cuf", "RI"},
  891.     {"cuf1", "nd"},
  892.     {"cup", "cm"},
  893.     {"cuu", "UP"},
  894.     {"cuu1", "up"},
  895.     {"cvvis", "vs"},
  896.     {"da", "da"},
  897.     {"db", "db"},
  898.     {"dch", "DC"},
  899.     {"dch1", "dc"},
  900.     {"dim", "mh"},
  901.     {"dl", "DL"},
  902.     {"dl1", "dl"},
  903.     {"dsl", "ds"},
  904.     {"ech", "ec"},
  905.     {"ed", "cd"},
  906.     {"el", "ce"},
  907.     {"el1", "cb"},
  908.     {"enacs", "eA"},
  909.     {"eo", "eo"},
  910.     {"eslok", "es"},
  911.     {"ff", "ff"},
  912.     {"flash", "vb"},
  913.     {"fsl", "fs"},
  914.     {"gn", "gn"},
  915.     {"hc", "hc"},
  916.     {"hd", "hd"},
  917.     {"home", "ho"},
  918.     {"hpa", "ch"},
  919.     {"hs", "hs"},
  920.     {"ht", "ta"},
  921.     {"hts", "st"},
  922.     {"hu", "hu"},
  923.     {"hz", "hz"},
  924.     {"ich", "IC"},
  925.     {"ich1", "ic"},
  926.     {"if", "if"},
  927.     {"il", "AL"},
  928.     {"il1", "al"},
  929.     {"in", "in"},
  930.     {"ind", "sf"},
  931.     {"indn", "SF"},
  932.     {"invis", "mk"},
  933.     {"ip", "ip"},
  934.     {"iprog", "iP"},
  935.     {"is1", "i1"},
  936.     {"is2", "is"},
  937.     {"is3", "i3"},
  938.     {"it", "it"},
  939.     {"kBEG", "&9"},
  940.     {"kCAN", "&0"},
  941.     {"kCMD", "*1"},
  942.     {"kCPY", "*2"},
  943.     {"kCRT", "*3"},
  944.     {"kDC", "*4"},
  945.     {"kDL", "*5"},
  946.     {"kEND", "*7"},
  947.     {"kEOL", "*8"},
  948.     {"kEXT", "*9"},
  949.     {"kFND", "*0"},
  950.     {"kHLP", "#1"},
  951.     {"kHOM", "#2"},
  952.     {"kIC", "#3"},
  953.     {"kLFT", "#4"},
  954.     {"kMOV", "%b"},
  955.     {"kMSG", "%a"},
  956.     {"kNXT", "%c"},
  957.     {"kOPT", "%d"},
  958.     {"kPRT", "%f"},
  959.     {"kPRV", "%e"},
  960.     {"kRDO", "%g"},
  961.     {"kRES", "%j"},
  962.     {"kRIT", "%i"},
  963.     {"kRPL", "%h"},
  964.     {"kSAV", "!1"},
  965.     {"kSPD", "!2"},
  966.     {"kUND", "!3"},
  967.     {"ka1", "K1"},
  968.     {"ka3", "K3"},
  969.     {"kb2", "K2"},
  970.     {"kbeg", "@1"},
  971.     {"kbs", "kb"},
  972.     {"kc1", "K4"},
  973.     {"kc3", "K5"},
  974.     {"kcan", "@2"},
  975.     {"kcbt", "kB"},
  976.     {"kclo", "@3"},
  977.     {"kclr", "kC"},
  978.     {"kcmd", "@4"},
  979.     {"kcpy", "@5"},
  980.     {"kcrt", "@6"},
  981.     {"kctab", "kt"},
  982.     {"kcub1", "kl"},
  983.     {"kcud1", "kd"},
  984.     {"kcuf1", "kr"},
  985.     {"kcuu1", "ku"},
  986.     {"kdch1", "kD"},
  987.     {"kdl1", "kL"},
  988.     {"ked", "kS"},
  989.     {"kel", "kE"},
  990.     {"kend", "@7"},
  991.     {"kent", "@8"},
  992.     {"kext", "@9"},
  993.     {"kf0", "k0"},
  994.     {"kf1", "k1"},
  995.     {"kf10", "k;"},
  996.     {"kf11", "F1"},
  997.     {"kf12", "F2"},
  998.     {"kf13", "F3"},
  999.     {"kf14", "F4"},
  1000.     {"kf15", "F5"},
  1001.     {"kf16", "F6"},
  1002.     {"kf17", "F7"},
  1003.     {"kf18", "F8"},
  1004.     {"kf19", "F9"},
  1005.     {"kf2", "k2"},
  1006.     {"kf20", "FA"},
  1007.     {"kf21", "FB"},
  1008.     {"kf22", "FC"},
  1009.     {"kf23", "FD"},
  1010.     {"kf24", "FE"},
  1011.     {"kf25", "FF"},
  1012.     {"kf26", "FG"},
  1013.     {"kf27", "FH"},
  1014.     {"kf28", "FI"},
  1015.     {"kf29", "FJ"},
  1016.     {"kf3", "k3"},
  1017.     {"kf30", "FK"},
  1018.     {"kf31", "FL"},
  1019.     {"kf32", "FM"},
  1020.     {"kf33", "FN"},
  1021.     {"kf34", "FO"},
  1022.     {"kf35", "FP"},
  1023.     {"kf36", "FQ"},
  1024.     {"kf37", "FR"},
  1025.     {"kf38", "FS"},
  1026.     {"kf39", "FT"},
  1027.     {"kf4", "k4"},
  1028.     {"kf40", "FU"},
  1029.     {"kf41", "FV"},
  1030.     {"kf42", "FW"},
  1031.     {"kf43", "FX"},
  1032.     {"kf44", "FY"},
  1033.     {"kf45", "FZ"},
  1034.     {"kf46", "Fa"},
  1035.     {"kf47", "Fb"},
  1036.     {"kf48", "Fc"},
  1037.     {"kf49", "Fd"},
  1038.     {"kf5", "k5"},
  1039.     {"kf50", "Fe"},
  1040.     {"kf51", "Ff"},
  1041.     {"kf52", "Fg"},
  1042.     {"kf53", "Fh"},
  1043.     {"kf54", "Fi"},
  1044.     {"kf55", "Fj"},
  1045.     {"kf56", "Fk"},
  1046.     {"kf57", "Fl"},
  1047.     {"kf58", "Fm"},
  1048.     {"kf59", "Fn"},
  1049.     {"kf6", "k6"},
  1050.     {"kf60", "Fo"},
  1051.     {"kf61", "Fp"},
  1052.     {"kf62", "Fq"},
  1053.     {"kf63", "Fr"},
  1054.     {"kf7", "k7"},
  1055.     {"kf8", "k8"},
  1056.     {"kf9", "k9"},
  1057.     {"kfnd", "@0"},
  1058.     {"khlp", "%1"},
  1059.     {"khome", "kh"},
  1060.     {"khts", "kT"},
  1061.     {"kich1", "kI"},
  1062.     {"kil1", "kA"},
  1063.     {"kind", "kF"},
  1064.     {"kll", "kH"},
  1065.     {"km", "km"},
  1066.     {"kmov", "%4"},
  1067.     {"kmrk", "%2"},
  1068.     {"kmsg", "%3"},
  1069.     {"knp", "kN"},
  1070.     {"knxt", "%5"},
  1071.     {"kopn", "%6"},
  1072.     {"kopt", "%7"},
  1073.     {"kpp", "kP"},
  1074.     {"kprt", "%9"},
  1075.     {"kprv", "%8"},
  1076.     {"krdo", "%0"},
  1077.     {"kref", "&1"},
  1078.     {"kres", "&5"},
  1079.     {"krfr", "&2"},
  1080.     {"kri", "kR"},
  1081.     {"krmir", "kM"},
  1082.     {"krpl", "&3"},
  1083.     {"krst", "&4"},
  1084.     {"ksav", "&6"},
  1085.     {"kslt", "*6"},
  1086.     {"kspd", "&7"},
  1087.     {"ktbc", "ka"},
  1088.     {"kund", "&8"},
  1089.     {"lf0", "l0"},
  1090.     {"lf1", "l1"},
  1091.     {"lf10", "la"},
  1092.     {"lf2", "l2"},
  1093.     {"lf3", "l3"},
  1094.     {"lf4", "l4"},
  1095.     {"lf5", "l5"},
  1096.     {"lf6", "l6"},
  1097.     {"lf7", "l7"},
  1098.     {"lf8", "l8"},
  1099.     {"lf9", "l9"},
  1100.     {"lh", "lh"},
  1101.     {"lines", "li"},
  1102.     {"ll", "ll"},
  1103.     {"lm", "lm"},
  1104.     {"lw", "lw"},
  1105.     {"mc0", "ps"},
  1106.     {"mc4", "pf"},
  1107.     {"mc5", "po"},
  1108.     {"mc5i", "5i"},
  1109.     {"mc5p", "pO"},
  1110.     {"mgc", "MC"},
  1111.     {"mir", "mi"},
  1112.     {"mrcup", "CM"},
  1113.     {"msgr", "ms"},
  1114.     {"nel", "nw"},
  1115.     {"nlab", "Nl"},
  1116.     {"npc", "NP"},
  1117.     {"nrrmc", "NR"},
  1118.     {"nxon", "nx"},
  1119.     {"os", "os"},
  1120.     {"pad", "pc"},
  1121.     {"pb", "pb"},
  1122.     {"pfkey", "pk"},
  1123.     {"pfloc", "pl"},
  1124.     {"pfx", "px"},
  1125.     {"pln", "pn"},
  1126.     {"prot", "mp"},
  1127.     {"rc", "rc"},
  1128.     {"rep", "rp"},
  1129.     {"rev", "mr"},
  1130.     {"rf", "rf"},
  1131.     {"rfi", "RF"},
  1132.     {"ri", "sr"},
  1133.     {"rin", "SR"},
  1134.     {"rmacs", "ae"},
  1135.     {"rmam", "RA"},
  1136.     {"rmcup", "te"},
  1137.     {"rmdc", "ed"},
  1138.     {"rmir", "ei"},
  1139.     {"rmkx", "ke"},
  1140.     {"rmln", "LF"},
  1141.     {"rmm", "mo"},
  1142.     {"rmp", "rP"},
  1143.     {"rmso", "se"},
  1144.     {"rmul", "ue"},
  1145.     {"rmxon", "RX"},
  1146.     {"rs1", "r1"},
  1147.     {"rs2", "r2"},
  1148.     {"rs3", "r3"},
  1149.     {"sc", "sc"},
  1150.     {"sgr", "sa"},
  1151.     {"sgr0", "me"},
  1152.     {"smacs", "as"},
  1153.     {"smam", "SA"},
  1154.     {"smcup", "ti"},
  1155.     {"smdc", "dm"},
  1156.     {"smgl", "ML"},
  1157.     {"smgr", "MR"},
  1158.     {"smir", "im"},
  1159.     {"smkx", "ks"},
  1160.     {"smln", "LO"},
  1161.     {"smm", "mm"},
  1162.     {"smso", "so"},
  1163.     {"smul", "us"},
  1164.     {"smxon", "SX"},
  1165.     {"tbc", "ct"},
  1166.     {"tsl", "ts"},
  1167.     {"uc", "uc"},
  1168.     {"ul", "ul"},
  1169.     {"vpa", "cv"},
  1170.     {"vt", "vt"},
  1171.     {"wind", "wi"},
  1172.     {"wsl", "ws"},
  1173.     {"xenl", "xn"},
  1174.     {"xhp", "xs"},
  1175.     {"xmc", "sg"},
  1176.     {"xoffc", "XF"},
  1177.     {"xon", "xo"},
  1178.     {"xonc", "XN"},
  1179.     {"xsb", "xb"},
  1180.     {"xt", "xt"}
  1181. };
  1182.  
  1183. int errno;
  1184. unsigned short errsup = 0;
  1185. xxTPUTxx
  1186. fi
  1187. if test -f 'tput.c'
  1188. then
  1189.     echo shar: "will not over-write existing file 'tput.c'"
  1190. else
  1191. cat << \xxTPUTxx > 'tput.c'
  1192. #ifndef LINT
  1193. static char rcsid[] = "$Header: tput.c,v 1.6 86/09/19 17:01:00 badri Exp $" ;
  1194. #endif LINT
  1195. /*
  1196.  * Copyright (C) $Date: 86/09/19 17:01:00 $
  1197.  * by $Author: badri $
  1198.  * University of Rochester,
  1199.  * Department of Electrical Engineering.
  1200.  *
  1201.  * CoNtEnTs   This file contains a program to emulate the system V
  1202.  * CoNtEnTs   version of tput.
  1203.  *
  1204.  * $Locker:  $
  1205.  * $Source: /u/users/badri/usr/src/local/tput/RCS/tput.c,v $
  1206.  * $Revision: 1.6 $
  1207.  *
  1208.  * History of this release:
  1209.  * $Log:    tput.c,v $
  1210.  * Revision 1.6  86/09/19  17:01:00  badri
  1211.  * Updated to incorporate -e flag etc.
  1212.  * 
  1213.  * Revision 1.5  86/09/18  20:58:09  badri
  1214.  * Rewrote match, which had a bug in it!
  1215.  * 
  1216.  * Revision 1.4  86/09/18  15:43:34  badri
  1217.  * Updated to incorporate all flags of the old SV tput plus cursor movement
  1218.  * plus -n flag to affect number of lines (if permitted.)
  1219.  * 
  1220.  * Revision 1.3  86/09/18  15:34:51  badri
  1221.  * This is an interim version to make tput more compatible with SV.
  1222.  * Mods suggested by mark@cbosgd (Mark Horton)
  1223.  * 
  1224.  * Revision 1.2  86/08/22  13:39:27  badri
  1225.  * 1. Corrected a bug that would cause %d to fail after %%.
  1226.  * 2. Included XTABS handling.
  1227.  * 3. General cleanup of code.
  1228.  * 1. Corrected a bug that would cause %d to fail after %%.
  1229.  * 2. Included XTABS handling.
  1230.  * 3. General cleanup of code.
  1231.  * 
  1232.  * Revision 1.1  86/08/21  19:23:33  badri
  1233.  * Initial revision
  1234.  * 
  1235.  */
  1236. #include "tput.h"
  1237.  
  1238. main(argc,argv)
  1239. int argc;
  1240. char *argv[];
  1241. {
  1242.     char bp[LARGEBUF], *getenv(), *tgetstr(), *tgoto(),
  1243.          buf[SMALLBUF], *id, *area, *ptr;
  1244.     int outc();
  1245.     struct sgttyb ttyprm;
  1246.     unsigned short ttyflg, arg, start, pos, end;
  1247.     long affcnt, val;
  1248.  
  1249.     if (argc < 2) quit(BADUSE,"fubar");
  1250.  
  1251.     arg = 1;
  1252.     affcnt = 1;
  1253.     val = -1;    /* This is used for examining if type of
  1254.              * terminal is explicitly specified.
  1255.              */
  1256.  
  1257.     while (argv[arg][0] == '-')
  1258.     {
  1259.         switch (argv[arg][1])
  1260.         {
  1261.             case 'T':    /* Terminal type */
  1262.             if (argv[arg][2] == '\0' || argc < 3)
  1263.                 quit(BADUSE,"fubar");
  1264.  
  1265.             if (tgetent(bp,&argv[arg][2]) < 1)
  1266.                 quit(BADTERM,&argv[arg][2]);
  1267.             val = 0;
  1268.             break;
  1269.  
  1270.             case 'e':    /* Suppress printing of error message */
  1271.             errsup = 1;
  1272.             break;
  1273.  
  1274.             case 'n':    /* No. of affected lines */
  1275.             affcnt = atoi(&argv[arg][2]); 
  1276.             break;
  1277.  
  1278.             default:
  1279.                 quit(BADUSE,"fubar");
  1280.         }
  1281.         arg++;
  1282.     }
  1283.     if (val < 0)
  1284.         if (tgetent(bp,getenv("TERM")) < 1)
  1285.             quit(BADTERM,"in environment variable TERM");
  1286.  
  1287.     /* Begin a binary search for capability in table */ 
  1288.     for (start = 0, end = TABLESIZE - 1, pos = (end - start) >> 1;
  1289.          end - start > 1; pos = start + ((end - start) >> 1))
  1290.     {
  1291.         switch (match(argv[arg],table[pos].key))
  1292.         {
  1293.             case -1:    /* Lexicographically less than pos */
  1294.             end = pos;
  1295.             continue;
  1296.  
  1297.             case  0:    /* A hit! */
  1298.             id = table[pos].value;
  1299.             goto WORK;
  1300.  
  1301.             case  1:    /* Lexicographically greater than pos. */
  1302.             start = pos;
  1303.             continue;
  1304.         }            
  1305.     }
  1306.  
  1307.     /* Examine the current start and end positions of table for match */
  1308.     if (!match(argv[arg],table[start].key)) id = table[start].value;
  1309.     else if (!match(argv[arg],table[end].key)) id = table[end].value;
  1310.     else quit(BADCAP,argv[arg]);  /* Could not find capability in table */
  1311.  
  1312.     WORK:
  1313.     /* At this point we know that the capability exists in our
  1314.      * table, but we do not know if it is of type boolean, string
  1315.      * or has a numeric value (or does not exist.)
  1316.      */
  1317.     if ((val = tgetnum(id)) != -1)
  1318.     {
  1319.         /* It has a numeric value. Print it and quit. */
  1320.         fprintf(stdout, "%d\n",val);
  1321.         quit(SUCCESS,"tput");
  1322.     }
  1323.  
  1324.     /* It is of type string (or boolean) */
  1325.     area = buf;
  1326.     if (!tgetstr(id,&area))
  1327.     {
  1328.         /* Boolean */
  1329.          if (tgetflag(id)) quit(SUCCESS,"tput");
  1330.         else quit(FAILURE,"tput");
  1331.     }
  1332.     /*
  1333.      * It is of type string.
  1334.      * Examine if cursor movement specified. This is done
  1335.      * by looking for % followed by any but %. Since %%
  1336.      * is a single %, we have to make sure that %% followed
  1337.      * by any but % is not interpreted as a format.
  1338.      * If cursor movement is specified then tgoto needs
  1339.      * to be invoked. Else put as is.
  1340.      */
  1341.     ptr = buf;
  1342.     while (*ptr != '\0')
  1343.     {
  1344.         if (*(ptr++) != '%') continue;
  1345.         if (*ptr != '\0' && *(ptr++) != '%')
  1346.         {
  1347.             /* This string is a cm string. Increment arg to
  1348.              * position it over the numeric argument (if specified!)
  1349.              */
  1350.             if (argc - ++arg < 2) quit(BADUSE,"fubar");
  1351.  
  1352.             if (*(ptr=tgoto(buf,atoi(argv[arg+1]),atoi(argv[arg])))
  1353.                 == 'O' && *(ptr+1) == 'O' &&
  1354.                 *(ptr+2) == 'P' && *(ptr+3) == 'S')
  1355.                 quit(BADUSE,"fubar");
  1356.  
  1357.             /* Turn off XTABS, but save old flags first. */
  1358.             if (gtty(fileno(stdout),&ttyprm) < 0)
  1359.                 quit(SYSTEM,"fubar");
  1360.             ttyflg = ttyprm.sg_flags;
  1361.  
  1362.             ttyprm.sg_flags &= ~XTABS;
  1363.             if (stty(fileno(stdout),&ttyprm) < 0)
  1364.                 quit(SYSTEM,"fubar");
  1365.  
  1366.             tputs(ptr,affcnt,outc);
  1367.  
  1368.             /* Restore old flags. */
  1369.             ttyprm.sg_flags = ttyflg;
  1370.             if (stty(fileno(stdout),&ttyprm) < 0)
  1371.                 quit(SYSTEM,"fubar");
  1372.             quit(SUCCESS,"tput");
  1373.         }
  1374.     quit(BADUSE,"fubar");
  1375.     }
  1376.     tputs(buf,affcnt,outc);
  1377.     quit(SUCCESS,"tput");
  1378. }
  1379.  
  1380. outc(c)
  1381. char c;
  1382. {
  1383.     if (write(fileno(stdout),&c,sizeof(char)) < 0)
  1384.         quit(SYSTEM,"fubar");
  1385.     return(SUCCESS);
  1386. }
  1387.  
  1388. match(s1,s2)
  1389. char *s1, *s2;
  1390. {
  1391.     while (*s1 == *s2)
  1392.     {
  1393.         if (*s1 == '\0') return(0);
  1394.         s1++, s2++;
  1395.     }
  1396.     return(*s1 > *s2 ? 1:-1);
  1397. }
  1398.  
  1399. quit(i,s)
  1400. int i;
  1401. char *s;
  1402. {
  1403.     if (errsup)
  1404.     {
  1405.         if (i < SYSTEM) exit(i);
  1406.         else exit(errno);
  1407.     }
  1408.     switch(i)
  1409.     {
  1410.         case SUCCESS:
  1411.         case FAILURE:
  1412.         exit(i);
  1413.  
  1414.         case BADUSE:
  1415.         fprintf(stderr,
  1416.         "Usage: tput [ -Ttype ] [ -e ] [ -nlines ] capname [ x y ]\n");
  1417.         exit(i);
  1418.     
  1419.         case BADTERM:
  1420.         fprintf(stderr, "Bad terminal type: %s\n",s);
  1421.         exit(i);
  1422.  
  1423.         case BADCAP:
  1424.         fprintf(stderr, "Bad capability: %s\n",s);
  1425.         exit(i);
  1426.  
  1427.         case SYSTEM:
  1428.         fprintf(stderr, "Terminal I/O error - examine exit status\n");
  1429.         exit(errno);
  1430.     }
  1431. }
  1432. xxTPUTxx
  1433. fi
  1434. exit 0
  1435. #    End of shell archive
  1436.  
  1437.